package com.suep.data_analysis.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.suep.data_analysis.dto.UserConfigDetailDto;
import com.suep.data_analysis.dto.UserConfigListDto;
import com.suep.data_analysis.mapper.UserConfigDetailMapper;
import com.suep.data_analysis.mapper.UserConfigListMapper;
import com.suep.data_analysis.model.Agent;
import com.suep.data_analysis.model.AgentSkills;
import com.suep.data_analysis.model.Armament;
import com.suep.data_analysis.model.UserConfig;
import com.suep.data_analysis.repository.AgentRepository;
import com.suep.data_analysis.repository.AgentSkillsRepository;
import com.suep.data_analysis.repository.ArmamentRepository;
import com.suep.data_analysis.repository.UserConfigRepository;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.*;
import java.util.stream.Collectors;

@Service
@AllArgsConstructor
public class UserConfigService {
    private final UserConfigRepository userConfigRepository;
    private final AgentRepository agentRepository;
    private final AgentSkillsRepository skillsRepository;
    private final ArmamentRepository armamentRepository;
    private final UserConfigListMapper listMapper;
    private final UserConfigDetailMapper detailMapper;

    /**
     * 查询指定用户的所有配置列表（基础信息）
     * 支持关键词搜索和排序
     */
    public List<UserConfigListDto> getUserConfigsByUserId(String userId, String keyword, String sortBy, String sortOrder) {
        // 构建查询条件
        Wrapper<UserConfig> queryWrapper = Wrappers.<UserConfig>lambdaQuery()
                .eq(UserConfig::getUserId, userId)
                .orderBy(true, "desc".equalsIgnoreCase(sortOrder), 
                        "createTime".equals(sortBy) ? UserConfig::getCreateTime :
                        "updateTime".equals(sortBy) ? UserConfig::getUpdateTime :
                        UserConfig::getCreateTime);

        // 获取基础配置列表
        List<UserConfig> configs = userConfigRepository.selectUserConfig(queryWrapper);

        if (configs.isEmpty()) {
            return Collections.emptyList();
        }

        // 如果有搜索关键词，进行过滤
        if (StringUtils.hasText(keyword)) {
            final String finalKeyword = keyword.toLowerCase();
            // 获取所有相关的代理人信息
            Set<String> agentIds = configs.stream()
                    .map(UserConfig::getAgentId)
                    .collect(Collectors.toSet());

            Map<String, Agent> agentMap = agentRepository.selectList(
                    Wrappers.<Agent>lambdaQuery()
                            .in(Agent::getAgentId, agentIds)
            ).stream().collect(Collectors.toMap(Agent::getAgentId, a -> a));

            // 过滤匹配关键词的配置
            configs = configs.stream()
                    .filter(config -> {
                        Agent agent = agentMap.get(config.getAgentId());
                        return agent != null && (
                                agent.getAgentName().toLowerCase().contains(finalKeyword) ||
                                agent.getElementType().toLowerCase().contains(finalKeyword)
                        );
                    })
                    .collect(Collectors.toList());
        }

        // 转换为列表DTO（只包含基本ID信息）
        return listMapper.toListDtoList(configs);
    }

    /**
     * 根据配置ID查询完整详情（含代理人、音擎和技能信息）
     */
    public UserConfigDetailDto getConfigDetailById(String configId) {
        UserConfig config = userConfigRepository.selectById(configId);
        if (config == null) {
            return null;
        }

        // 查询关联的代理人信息
        Agent agent = agentRepository.selectById(config.getAgentId());

        // 查询关联的音擎信息
        Armament armament = null;
        if (config.getArmamentId() != null) {
            armament = armamentRepository.selectById(config.getArmamentId());
        }

        // 查询关联的技能信息
        List<AgentSkills> skills = skillsRepository.selectList(
                Wrappers.<AgentSkills>lambdaQuery()
                        .eq(AgentSkills::getAgentId, config.getAgentId())
        );

        // 组装详情DTO
        return detailMapper.toDetailDto(config, agent, armament, skills);
    }

    /**
     * 查询指定用户的所有配置详情（含代理人、音擎和技能信息）
     * 支持关键词搜索
     */
    public List<UserConfigDetailDto> getAllUserConfigDetails(String userId, String keyword) {
        // 构建查询条件
        Wrapper<UserConfig> queryWrapper = Wrappers.<UserConfig>lambdaQuery()
                .eq(UserConfig::getUserId, userId);

        // 调用自定义条件查询
        List<UserConfig> configs = userConfigRepository.selectUserConfig(queryWrapper);

        if (configs.isEmpty()) {
            return Collections.emptyList();
        }

        // 提取所有关联的代理人ID和音擎ID
        Set<String> agentIds = configs.stream()
                .map(UserConfig::getAgentId)
                .collect(Collectors.toSet());
        
        Set<String> armamentIds = configs.stream()
                .map(UserConfig::getArmamentId)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());

        // 批量查询关联的代理人信息
        Map<String, Agent> agentMap = agentRepository.selectList(
                Wrappers.<Agent>lambdaQuery()
                        .in(Agent::getAgentId, agentIds)
        ).stream().collect(Collectors.toMap(Agent::getAgentId, a -> a));

        // 批量查询关联的音擎信息
        Map<String, Armament> armamentMap = new HashMap<>();
        if (!armamentIds.isEmpty()) {
            armamentMap = armamentRepository.selectList(
                    Wrappers.<Armament>lambdaQuery()
                            .in(Armament::getArmamentId, armamentIds)
            ).stream().collect(Collectors.toMap(Armament::getArmamentId, a -> a));
        }

        // 如果有搜索关键词，过滤代理人
        if (StringUtils.hasText(keyword)) {
            final String finalKeyword = keyword.toLowerCase();
            agentMap = agentMap.entrySet().stream()
                    .filter(entry -> {
                        Agent agent = entry.getValue();
                        return agent.getAgentName().toLowerCase().contains(finalKeyword) ||
                               agent.getElementType().toLowerCase().contains(finalKeyword);
                    })
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        }

        // 批量查询关联的技能信息
        Map<String, List<AgentSkills>> skillsMap = skillsRepository.selectList(
                Wrappers.<AgentSkills>lambdaQuery()
                        .in(AgentSkills::getAgentId, agentMap.keySet())
        ).stream().collect(Collectors.groupingBy(AgentSkills::getAgentId));

        // 过滤配置列表，只保留匹配的代理人
        Map<String, Agent> finalAgentMap = agentMap;
        configs = configs.stream()
                .filter(config -> finalAgentMap.containsKey(config.getAgentId()))
                .collect(Collectors.toList());

        // 批量转换为详情DTO
        return detailMapper.toDetailDtoList(configs, agentMap, armamentMap, skillsMap);
    }

    /**
     * 保存或更新用户配置
     */
    public UserConfigDetailDto saveUserConfig(UserConfig config) {
        if (config.getConfigId() == null) {
            userConfigRepository.insert(config);
        } else {
            userConfigRepository.updateById(config);
        }
        return getConfigDetailById(config.getConfigId());
    }

    /**
     * 删除用户配置
     */
    public void deleteUserConfig(String configId) {
        userConfigRepository.deleteById(configId);
    }
}